package utils

import (
	"encoding/json"
	model "mars-backend/models"
	"math/rand"
	"strconv"
	"time"

	"github.com/astaxie/beego"
	"gopkg.in/mgo.v2/bson"
)

type User model.User

const (
	userTable = "users"
)

// TODO
func AddUserToDB() {
	session, _ := GetMongoSession()
	defer session.Close()
	utable := session.DB("").C("users")
	uctObj := genUserData()
	// utable.Find(bson.M{"mobile": c.Mobile}).One(&uctObj)
	utable.Insert(uctObj)
}

// 删除单一用户
func DeleteUserById(id string) {
	session, err := GetMongoSession()
	if err != nil {
		beego.Error(err.Error())
	}
	defer session.Close()
	utable := session.DB("").C(userTable)
	beego.Info(bson.ObjectIdHex(id))
	err = utable.Update(
		bson.M{"_id": bson.ObjectIdHex(id)},
		bson.M{"$set": bson.M{"isdelete": 1}})
}

// 批量删除用户
func DeleteManyUsersByID(ids []string) {
	session, err := GetMongoSession()
	errorHandling(err)
	defer session.Close()
	utable := session.DB("").C(userTable)
	for _, id := range ids {
		beego.Info(bson.ObjectIdHex(id))
		err = utable.Update(
			bson.M{"_id": bson.ObjectIdHex(id)},
			bson.M{"$set": bson.M{"isdelete": 1}})
		errorHandling(err)
	}
}

// 取消删除单一用户
func CancelDeleteUserById(id string) {
	session, err := GetMongoSession()
	if err != nil {
		beego.Error(err.Error())
	}
	defer session.Close()
	utable := session.DB("").C(userTable)
	beego.Info(bson.ObjectIdHex(id))
	err = utable.Update(
		bson.M{"_id": bson.ObjectIdHex(id)},
		bson.M{"$set": bson.M{"isdelete": 0}})
}

// 批量删除用户
func CancelDeleteManyUsersByID(ids []string) {
	session, err := GetMongoSession()
	errorHandling(err)
	defer session.Close()
	utable := session.DB("").C(userTable)
	for _, id := range ids {
		beego.Info(bson.ObjectIdHex(id))
		err = utable.Update(
			bson.M{"_id": bson.ObjectIdHex(id)},
			bson.M{"$set": bson.M{"isdelete": 0}})
		errorHandling(err)
	}
}

//
func SearchUserbyIsDelete(page, limit, isdelete int) []byte {
	var userlist model.UserPerPage
	var user model.User
	session, err := GetMongoSession()
	errorHandling(err)
	defer session.Close()

	utable := session.DB("").C(userTable)
	total, _ := utable.Find(bson.M{"isdelete": isdelete}).Count()
	if total != 0 {
		userlist.Total = total
	}
	beego.Info(total)
	iter := utable.Find(bson.M{"isdelete": isdelete}).Sort("createtime").Skip((page - 1) * limit).Limit(limit).Iter()
	for iter.Next(&user) {
		userlist.Users = append(userlist.Users, user)
	}
	if err := iter.Close(); err != nil {
		errorHandling(err)
	}
	data, _ := json.Marshal(userlist)
	return data
}

// 随机生成一个用用户数据
func genUserData() User {
	return User{
		ID:            bson.NewObjectId(),
		Name:          RandomChineseName(),
		Sex:           "1",
		Nation:        "中国",
		OriginAddress: "北京市",
		BirthAddress:  "山东省",
		BirthDate:     "1990-01-01",
		Mobile:        genMobile(),
		Email:         "test@mail.com",
		// Education:           ,
		// WorkExperience:      genCharactarVarying(512),
		Honor:               genCharactarVarying(128),
		Company:             genCharactarVarying(20),
		CompanyYear:         "10",
		CompanyNature:       genCharactarVarying(256),
		Industry:            []string{"石化/冶金/能源/环保：新能源 电力煤炭 石油 天然气 矿产 环保 橡胶塑料 涂料 化学原料 化学产品,房产/建筑/餐饮/旅游/招商"},
		CompanyContribution: genCharactarVarying(128),
		Advantage:           genCharactarVarying(256),
		Requirement:         genCharactarVarying(128),
		Supply:              genCharactarVarying(128),
		CreateTime:          time.Now(),
		IsDelete:            0,
		Password:            "202cb962ac59075b964b07152d234b70", // 123
	}
}

//
func genMobile() string {
	prefix := []string{"188", "156", "155", "134", "177"}
	length := 11 - len(prefix[0])
	rand.Seed(time.Now().UnixNano())
	var mobile string
	mobile = prefix[rand.Intn(len(prefix))]
	for i := 0; i < length; i++ {
		mobile += strconv.Itoa(rand.Intn(10))
	}
	return mobile
}

func genCharactarVarying(l int) string {
	b := make([]byte, l)
	for i := range b {
		b[i] = letterBytes[rand.Intn(len(letterBytes))]
	}
	// beego.Info(string(b))
	return string(b)
}

func genIndustry() {
	// var arr = []string {
	// 	"金融/教育/企业服务：证券 投资 保险 银行 职业技能 语言培训 课外辅导 兴趣培训 早教 法律 财税 商标专利 招聘",
	// 	"机械/电子/汽车/五金：汽车相关 工程自动化 模具铸造 机床动力 工具设备 专用机械 五金配件 电子元件",
	// 	"食品/烟酒/医药/美容：食品 烟酒 饮料 医药 医疗服务 医疗器械 整形美容 生物技术",
	// 	"石化/冶金/能源/环保：新能源 电力煤炭 石油 天然气 矿产 环保 橡胶塑料 涂料 化学原料 化学产品",
	// 	"房产/建筑/餐饮/旅游/招商：房地产 建材 装饰装修 物业中介 品牌招商 旅游 酒店 餐饮 休闲",
	// 	"粮食/畜牧/养殖/花卉/苗木：苗木花卉 粮食种业 猪牛羊 家禽 水产 饲料 农药化肥",
	// 	"IT/互联网/广告/文化/传媒/演艺：互联网 游戏 硬件 软件 创意设计 广告传媒 影视动漫 美术工艺",
	// 	"家居/纺织/消防/运输：家具 日杂 化妆品 服装 鞋帽箱包 纺织原料 物流运输 安防 消防 包装 印刷 工艺品 纸张",
	// 	"协会/组织/校友/战友/兴趣/联盟：职业联盟 校友 战友 同乡 兴趣 运动 公共事业 综合",
	// 	"其他行业：体育 手机 通讯 家电 ",
	// }
}

var Xing = []string{"赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫"}

func RandomChineseName() string {
	i := RandInt(0, 2)
	if i == 0 {
		return genTwoName()
	}
	return genThreeName()
}

func genTwoName() string {
	re := Xing[RandInt(0, int64(len(Xing)))] + string(rune(RandInt(19968, 40869)))
	return re
}

func genThreeName() string {
	re := Xing[RandInt(0, int64(len(Xing)))] + string(rune(RandInt(19968, 40869))) + string(rune(RandInt(19968, 40869)))
	return re
}

func RandInt(min, max int64) int64 {
	rand.Seed(time.Now().UnixNano())
	return min + rand.Int63n(max-min)
}

func errorHandling(err error) {
	if err != nil {
		beego.Error(err)
	}
}
